/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package managers;

import entity.Description;
import entity.Langue;
import entity.Produit;
import entity.RelationTypes;
import entity.TypeProduit;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import session.DescriptionFacade;
import session.ProduitFacade;
import session.RelationTypesFacade;
import session.TypeProduitFacade;


/**
 *
 * @author livetnediser
 */
@Stateless
public class ProduitManager {
    
    @PersistenceContext(unitName = "SexyShopPU")
    private EntityManager em;
    
    @EJB
    private ProduitFacade produitFacade;
    
    @EJB
    private DescriptionFacade descriptionFacade;
    
    @EJB
    private RelationTypesFacade relationTypesFacade;
    
    @EJB
    private TypeProduitFacade typeProduitFacade;
    
    
    
    public List<ProduitEtDescrip> getProdEtDescrip(Langue langue){
        List<ProduitEtDescrip> aux = new ArrayList<ProduitEtDescrip>();
        List<Produit> prods = produitFacade.findAll();
        
        for(Produit p: prods){
            aux.add(new ProduitEtDescrip(p, this.getDescripByProductEtLang(langue, p)));
        }
        
        return aux;
    }
    
    /**
     * opt true = General type
     * opt false = Specific type
     * @param langue
     * @param type
     * @param opt
     * @return 
     */
    public List<ProduitEtDescrip> getProdEtDescrip(Langue langue, TypeProduit type, boolean opt){
        List<ProduitEtDescrip> aux = new ArrayList<ProduitEtDescrip>();
        List<Produit> prods;
        if(opt){
            prods = produitFacade.findByTypeGen(type.getIdtypeProduit());
        }else{
            prods = produitFacade.findByTypeSpec(type.getIdtypeProduit());
        }
        if(prods == null){
            return null;
        }
        else{
            for(Produit p: prods){
                aux.add(new ProduitEtDescrip(p, this.getDescripByProductEtLang(langue, p)));
            }

            return aux;
        }
    }
    
    public Description getDescripByProductEtLang(Langue langue, Produit prod){
        List<Description> aux = em.createQuery("SELECT d FROM Description d WHERE d.iddescription = :prodDescId AND d.idLangue = :langue")
        .setParameter("prodDescId", prod.getIdDescription())
        .setParameter("langue", langue)
        .getResultList();
        
        if(aux != null && aux.size()>0){
	    return aux.get(0);
	} else{
	    return null;
	}
    }
    /**
     * Retourne la liste des sous-categories pour une categorie donné
     * @param On fournit le string qui correspond a l'id du TypeProduit (la categorie generique)
     * pour lequel on cherche la sous categorie.
     * @return 
     */
    public List<TypeProduit> getSubtypesByType(String categ, Langue langue) {
        List<RelationTypes> relations = new ArrayList<RelationTypes>();
        relations = relationTypesFacade.findByTypeGen(Integer.parseInt(categ));

        List<TypeProduit> subtypesReturn = new ArrayList<TypeProduit>();
        TypeProduit aux;
        for (RelationTypes rT : relations) {
            aux = typeProduitFacade.findTypeProduitById(("" + rT.getIdSpec()), langue);
            subtypesReturn.add(aux);
        }
        if (subtypesReturn != null && subtypesReturn.size() > 0) {
            return subtypesReturn;
        } else {
            return null;
        }
    }
    
    public List<TypeProduit> getTypes(Langue lang){
       List<TypeProduit> ret = new ArrayList<TypeProduit>();
       RelationTypes aux = null;
       List<RelationTypes> rels = relationTypesFacade.findAll();
        
       for(RelationTypes rt: rels){
           if(aux == null || aux.getIdGen()!= rt.getIdGen()){
              ret.add(typeProduitFacade.findTypeProduitById(rt.getIdGen(), lang));
              aux = rt;
           }
       } 
       return ret;
    }
    
    public List<List<TypeProduit>> getSubTypes(Langue lang){
       List<TypeProduit> auxl = new ArrayList<TypeProduit>();
       RelationTypes aux = null;
       List<RelationTypes> rels = relationTypesFacade.findAll();
        
       for(RelationTypes rt: rels){
           if(aux == null || aux.getIdGen()!= rt.getIdGen()){
              auxl.add(typeProduitFacade.findTypeProduitById(rt.getIdGen(), lang));
              aux = rt;
           }
       }
       
       List<List<TypeProduit>> ret = new ArrayList<List<TypeProduit>>(auxl.size());
       for(int i = 0; i< auxl.size(); i++){
           ret.add(new ArrayList<TypeProduit>());
       }
       
       int l = 0;
       aux = null;
       for(RelationTypes rt: rels){
          if(aux != null && aux.getIdGen()!= rt.getIdGen()){
            l++;
          }
          ret.get(l).add(typeProduitFacade.findTypeProduitById(rt.getIdSpec(), lang));            

          aux = rt;
       }
       
       return ret;
    }
    
    public int retOrdType(int id){
       RelationTypes aux = null;
       List<RelationTypes> rels = relationTypesFacade.findAll();
       int l=0;
       for(RelationTypes rt: rels){
           
           if(aux != null && aux.getIdGen()!= rt.getIdGen()){
                l++;
           }
           
           if(rt.getIdGen()==id){
               return l;
           } 
           
           aux = rt;
       }     
       return -1;
    }
    
    public int retOrdSpecType(int id, int idspec){
       RelationTypes aux = null;
       List<RelationTypes> rels = relationTypesFacade.findByTypeGen(id);
       int l=0;
       for(RelationTypes rt: rels){
           
           if(aux != null && aux.getIdSpec()!= rt.getIdSpec()){
                l++;
           }
           
           if(rt.getIdSpec()==idspec){
               return l;
           } 
           
           aux = rt;
       }     
       return -1;
    }
    
    public boolean updateProduct(String id, String prix, String remise, String st_in, String st_act, String st_not, String descB, String descL, String tags, String typeGen, String typeSpec, String image, Langue langue){
        boolean success = true;
        try{
            Produit p = produitFacade.find(Integer.parseInt(id));
            Description d = descriptionFacade.findByProductLangue(p, langue);

            if(d == null){
                d = new Description();
                d.setIdLangue(langue);
                d.setDescription(descL);
                d.setDescriptionBref(descB);
                d.setTags(tags);
                d.setIddescription(p.getIdDescription());
                em.persist(d);
            }else{
                d.setDescription(descL);
                d.setDescriptionBref(descB);
                d.setTags(tags);
                em.merge(d);
            }
            
            p.setPrix(Double.parseDouble(prix));
            p.setRemise(Integer.parseInt(remise));
            p.setStockInitial(Integer.parseInt(st_in));
            p.setStockActuel(Integer.parseInt(st_act));
            p.setStockNotification(Integer.parseInt(st_not));
            p.setTags(tags);
            p.setIdTypeProdGenerique(Integer.parseInt(typeGen));
            p.setIdTypeProdSpecifique(Integer.parseInt(typeSpec));
            if(image != null) p.setImage(image);


            em.merge(p);

        }catch(Exception e){
            return false;
        }
            
        return success;
    }

    public ProduitEtDescrip createProduct(String prix, String remise, String st_in, String st_act, String st_not, String descB, String descL, String tags, String typeGen, String typeSpec, String image, List<Langue> langues) {
        Produit p = new Produit();
        
        p.setPrix(Double.parseDouble(prix));
        p.setRemise(Integer.parseInt(remise));
        p.setStockInitial(Integer.parseInt(st_in));
        p.setStockActuel(Integer.parseInt(st_act));
        p.setStockNotification(Integer.parseInt(st_not));
        p.setTags(tags);
        p.setIdTypeProdGenerique(Integer.parseInt(typeGen));
        p.setIdTypeProdSpecifique(Integer.parseInt(typeSpec));
        if(image != null) p.setImage(image);
        
        List<Description> l = descriptionFacade.findAll();
        
        int iddesc = 1;
        for(Description d: l){
            if(d.getIddescription()>iddesc) iddesc = d.getIddescription();
        }
        iddesc++;
        boolean primer = true;
        Description dt = null;
        for(Langue langue: langues){
        Description d = new Description();
            d.setDescription(descL);
            d.setDescriptionBref(descB);
            d.setIdLangue(langue);
            d.setTags(tags);
            d.setIddescription(iddesc);
            if(primer){
                primer = false;
                dt = d;
            }
            em.persist(d);
        }
        p.setIdDescription(iddesc);
        
        em.persist(p);
        
        
        return new ProduitEtDescrip(p,dt);
    }
}
